﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using OwnZTec.DbCommon;
using OwnZTec.Dto;

namespace OwnZTec.Da
{
    public class DaPerfil : IDaLeitura<DtoPerfil>, IDaEscrita<DtoPerfil>
    {
        #region -- Mapeamento -------------------------------------------------------------------------------------------------------------
        internal static Mapeamento<DtoPerfil> Mapear = delegate(IDataReader dr, DtoPerfil obj)
        {
            obj.Id = Utils.ParaInteiro(dr["idPerfil"]);
            obj.Nome = Utils.ParaString(dr["desPerfil"]);

            if (!Utils.EhDbNull(dr["desDescricao"]))
                obj.Descricao = Utils.ParaString(dr["desDescricao"]);
        };
        #endregion ------------------------------------------------------------------------------------------------------------------------

        #region -- Metodos de Leitura -----------------------------------------------------------------------------------------------------
        public List<DtoPerfil> ListarTodos()
        {
            var db = new DbCommon.DbCommon
                         {
                             TipoComando = CommandType.StoredProcedure,
                             Comando = "uspPerfilListarTodos"
                         };

            return db.ExecutarLista(Mapear);
        }

        public DtoPerfil ListarUm(int id)
        {
            var db = new DbCommon.DbCommon
            {
                TipoComando = CommandType.StoredProcedure,
                Comando = "uspPerfilListarUm"
            };

            db.Parametros.Add(db.CriarParametro("Id", id, ParameterDirection.Input));

            return db.ExecutarObjeto(Mapear);
        }

        public bool ExistePerfil(string nome, int id = 0)
        {
            try
            {
                var db = new DbCommon.DbCommon
                {
                    TipoComando = CommandType.StoredProcedure,
                    Comando = "uspPerfilExiste"
                };

                var ok = false;

                db.Parametros.Add(db.CriarParametro("Perfil", nome, 50, ParameterDirection.Input));
                db.Parametros.Add(db.CriarParametro("Id", id, ParameterDirection.Input));
                db.Parametros.Add(db.CriarParametro("Status", ok, ParameterDirection.Output));

                db.ExecutarSemRetorno();

                ok = (bool)db.Parametros.Where(p => p.ParameterName == "@Status").First().Value;

                return ok;
            }
            catch
            {
                return false;
            }
        }
        #endregion ------------------------------------------------------------------------------------------------------------------------

        #region -- Metodos de Escrita -----------------------------------------------------------------------------------------------------
        public bool Salvar(DtoPerfil item)
        {
            return item.Id == 0 ? CriarPerfil(item) : AtualizaPerfil(item);
        }

        private static bool AtualizaPerfil(DtoPerfil item)
        {
            try
            {
                var db = new DbCommon.DbCommon
                {
                    TipoComando = CommandType.StoredProcedure,
                    Comando = "uspPerfilAlterar"
                };

                db.Parametros.Add(db.CriarParametro("Id", item.Id, ParameterDirection.Input));
                db.Parametros.Add(db.CriarParametro("Nome", item.Nome, 50, ParameterDirection.Input));
                db.Parametros.Add(db.CriarParametro("Descricao", item.Descricao, ParameterDirection.Input));

                db.ExecutarSemRetorno();

                return true;
            }
            catch
            {
                return false;
            }
        }

        private static bool CriarPerfil(DtoPerfil item)
        {
            try
            {
                var db = new DbCommon.DbCommon
                {
                    TipoComando = CommandType.StoredProcedure,
                    Comando = "uspPerfilCriar"
                };

                db.Parametros.Add(db.CriarParametro("Nome", item.Nome, 50, ParameterDirection.Input));
                db.Parametros.Add(db.CriarParametro("Descricao", item.Descricao, ParameterDirection.Input));
                db.Parametros.Add(db.CriarParametro("Id", item.Id, ParameterDirection.Output));

                db.ExecutarSemRetorno();

                item.Id = (int)db.Parametros.Where(p => p.ParameterName == "@Id").First().Value;

                return true;
            }
            catch
            {
                return false;
            }
        }

        public bool Excluir(int id)
        {
            try
            {
                var db = new DbCommon.DbCommon
                {
                    TipoComando = CommandType.StoredProcedure,
                    Comando = "uspPerfilExcluir"
                };

                db.Parametros.Add(db.CriarParametro("id", id, ParameterDirection.Input));

                db.ExecutarSemRetorno();

                return true;
            }
            catch
            {
                return false;
            }
        }

        public bool ExcluirTodos()
        {
            throw new NotImplementedException();
        }
        #endregion ------------------------------------------------------------------------------------------------------------------------
    }
}
